package Leetcode.数组字符串;

/**
 * @ClassName 移动片段得到字符串
 * @since: 2023/8/21 08:51
 * @auth: kirito
 * @description:
 * 首先，无论怎么移动，由于 L 和 R 无法互相穿过对方，那么去掉 _ 后的剩余字符应该是相同的，否则返回 false。
 *
 * 然后用双指针从左向右遍历 start 和 target分类讨论：
 *
 * 如果当前字符为 L 且 i<j，由于 L 由于无法向右移动，返回 false；
 * 如果当前字符为 R 且 i>j，由于 R 由于无法向左移动，返回 false。
 *
 * 作者：灵茶山艾府
 * 链接：https://leetcode.cn/problems/move-pieces-to-obtain-a-string/solutions/1/nao-jin-ji-zhuan-wan-pythonjavacgo-by-en-9sqt/
 **/
public class 移动片段得到字符串 {
    /**
     * 判断是否可以进行变换
     * @param start 开始字符串
     * @param target 目标字符串
     * @return 可以进行变换返回true，否则返回false
     */
    public boolean canChange(String start, String target) {
        // 去除下划线后比较两个字符串是否相等
        if (!start.replaceAll("_", "").equals(target.replaceAll("_", "")))
            return false;

        // 遍历两个字符串并进行比较
        for (int i = 0, j = 0; i < start.length(); i++) {
            //start字符遍历到第一个非 _ 的字符  然后再去while遍历target的第一个非 _ 的字符，此时索引j
            //这里可能有点懵，但是好理解，这跟两个循环分别判定没区别，只是这样写代码更加简洁
            if (start.charAt(i) == '_'){
                continue;
            }
            // 跳过目标字符串中的下划线
            while (target.charAt(j) == '_'){
                j++;
            }
            //取到两个字符串分别第一个非 _ 的字符的索引后
            // 比较字符'L'的位置是否满足条件==》如果i！=j，且（字符i为L，且此时i《j）返回false 应该i>=j才true
//            if (i != j && (start.charAt(i) == 'L') == (i < j)){
//                return false;
//            }
            //提问：问什么判断完一次就可以++j了？不用管其他条件了吗？
            /*
            * i=j  不用判断对应的字符相等吗？  不用，因为第一个条件就判断了，证明此时的两个字符中对应的字母顺序都是一样的
            * 此时只有i!=j  在判断start.charAt(i) == 'R'不管吗?  =》不管，此时=L和i<j分别为条件1，2
            * 条件1不变+》条件2变  则true  j++ 所以不管
            * 条件1变  条件2不变， 此时i为R，且i<j  为true  不管  这里也逻辑等价上面那个。
            * 条件1变  条件2也变  此时i为R  且i>=R  也要返回false？ 不管，因为逻辑等价，这个点仔细想想
            * */
            //保证好看懂可以写以下
            if (i != j) {
                if (start.charAt(i) == 'L' && i < j) {
                    return false;
                }
                if (start.charAt(i) == 'R' && i > j) {
                    return false;
                }
            }
            ++j;
        }

        // 可以进行变换
        return true;
    }


}
